package com.yt.web.unit;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Throwables;


public class QySignatures {
	
	 private static Logger log = LoggerFactory.getLogger(QySignatures.class);
	
	 public static String buildParams(Map<String, String> params, String paramKey) {
	        String toVerify = "";
	        String theKey = paramKey;
	        // 将Map排序
	        if (!(params instanceof SortedMap)) {
	            params = new TreeMap<String, String>(params);
	        }
	        // 拼接字符串 剔除值为空的键值对
	        Iterator<String> iter = params.keySet().iterator();
	        while(iter.hasNext()){
	            String key = iter.next();
	            if(params.get(key) != null && params.get(key) != ""){
	                toVerify += key + "=" + params.get(key) + "&";
	            }
	        }

	        try {
	            if(toVerify.length() > 0)
	                toVerify = toVerify.substring(0, toVerify.length() - 1);
	            //String sign = convertToMD5(toVerify + theKey);
	            String sign = MD5Encoder(toVerify + theKey, "utf-8");
	            return sign;
	        } catch (Exception e) {
	            throw new RuntimeException("failed to build params", e);
	        }
	    }

	    public final static String MD5Encoder(String s, String charset) {
	        try {
	            byte[] btInput = s.getBytes(charset);
	            MessageDigest mdInst = MessageDigest.getInstance("MD5");
	            mdInst.update(btInput);
	            byte[] md = mdInst.digest();
	            StringBuffer sb = new StringBuffer();
	            for (int i = 0; i < md.length; i++) {
	                int val = ((int) md[i]) & 0xff;
	                if (val < 16) {
	                    sb.append("0");
	                }
	                sb.append(Integer.toHexString(val));
	            }
	            return sb.toString();
	        } catch (Exception e) {
	            return null;
	        }
	    }
	    
	    
	    /** 
	     * 发送GET请求 
	     *  
	     * @param url 
	     *            目的地址 
	     * @param parameters 
	     *            请求参数，Map类型。 
	     * @return 远程响应结果 
	     */  
	    public static String sendGet(String url, Map<String, String> parameters) {  
	        String result = "";// 返回的结果  
	        BufferedReader in = null;// 读取响应输入流  
	        StringBuffer sb = new StringBuffer();// 存储参数  
	        String params = "";// 编码之后的参数  
	        try {  
	            // 编码请求参数  
	            if (parameters.size() == 1) {  
	                for (String name : parameters.keySet()) {  
	                    sb.append(name).append("=").append(  
	                            java.net.URLEncoder.encode(parameters.get(name),  
	                                    "UTF-8"));
	                }  
	                params = sb.toString();  
	            } else {  
	                for (String name : parameters.keySet()) {  
	                    sb.append(name).append("=").append(  
	                            java.net.URLEncoder.encode(parameters.get(name),  
	                                    "UTF-8")).append("&");  
	                    System.out.println(name);
	                }  
	                String temp_params = sb.toString();  
	                params = temp_params.substring(0, temp_params.length() - 1);  
	            }  
	            String full_url = url + "?" + params;   
	            
	            
	            System.out.println("full_url:::"+full_url);
	            
	            
	            // 创建URL对象  
	            java.net.URL connURL = new java.net.URL(full_url);  
	            // 打开URL连接  
	            java.net.HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL  
	                    .openConnection();  
	            // 设置通用属性  
	            httpConn.setRequestProperty("Accept", "*/*");  
	            httpConn.setRequestProperty("Connection", "Keep-Alive");  
	            httpConn.setRequestProperty("User-Agent",  
	                    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");  
	            // 建立实际的连接  
	            httpConn.connect();  
	            // 响应头部获取  
	            Map<String, List<String>> headers = httpConn.getHeaderFields();  
	            // 遍历所有的响应头字段  
	            for (String key : headers.keySet()) {  
	                System.out.println(key + "\t：\t" + headers.get(key));  
	            }  
	            // 定义BufferedReader输入流来读取URL的响应,并设置编码方式  
	            in = new BufferedReader(new InputStreamReader(httpConn  
	                    .getInputStream(), "UTF-8"));  
	            String line;  
	            // 读取返回的内容  
	            while ((line = in.readLine()) != null) {  
	                result += line;  
	            }  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        } finally {  
	            try {  
	                if (in != null) {  
	                    in.close();  
	                }  
	            } catch (IOException ex) {  
	                ex.printStackTrace();  
	            }  
	        }  
	        return result;  
	    }  

	    /** 
	     * 发送POST请求 
	     *  
	     * @param url 
	     *            目的地址 
	     * @param parameters 
	     *            请求参数，Map类型。 
	     * @return 远程响应结果 
	     */  
	    public static String sendPost(String url, Map<String, String> parameters) {  
	        String result = "";// 返回的结果  
	        BufferedReader in = null;// 读取响应输入流  
	        PrintWriter out = null;  
	        StringBuffer sb = new StringBuffer();// 处理请求参数  
	        String params = "";// 编码之后的参数  
	        try {  
	            // 编码请求参数  
	        	if(parameters!=null){
	        		if (parameters.size() == 1) {  
	                    for (String name : parameters.keySet()) {  
	                        sb.append(name).append("=").append(  
	                                java.net.URLEncoder.encode(parameters.get(name),  
	                                        "UTF-8"));  
	                    }  
	                    params = sb.toString();  
	                } else {  
	                    for (String name : parameters.keySet()) {  
	                    	
	                    	  sb.append(name).append("=").append(  
	                                  java.net.URLEncoder.encode(parameters.get(name),  
	                                          "UTF-8")).append("&");
	                    	
	                    	
	                        /*sb.append(name).append("=").append(  
	                                java.net.URLEncoder.encode(parameters.get(name),  
	                                        "UTF-8")).append("&");  */
	                    }  
	                    String temp_params = sb.toString();  
	                    params = temp_params.substring(0, temp_params.length() - 1);  
	                }  
	        	}
	        	
	        log.info("企业客户url:"+url);
	        log.info("企业客户params"+params);
//	        	System.out.println(url);
//	        	System.out.println(params);
	        	
	        //	params = "channel=rryxapp&loginId=oS555s4Lp8zdQXSSHX7SglY6QIng&redirectUrl=http%3A%2F%2Fm.rrs.com%2Fmobile%2Fitem%2F34739.html%3FchannelOrderId%3D522&channelSource=rryxapp&type=112&unionId=rryxapp&sign=a4510f58679507ad9b94792aff702864";
	        	
	        /*	System.out.println(params);*/
	        	
	        	
	            // 创建URL对象  
	            java.net.URL connURL = new java.net.URL(url);  
	            // 打开URL连接  
	            java.net.HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL  
	                    .openConnection();  
	            // 设置通用属性 
	            //httpConn.setRequestMethod("POST"); // 设置请求方式
	            httpConn.setRequestProperty("Accept", "*/*");  
	            httpConn.setRequestProperty("Connection", "Keep-Alive");  
	            httpConn.setRequestProperty("User-Agent",  
	                    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");  
	            // 设置POST方式  
	            httpConn.setDoInput(true);  
	            httpConn.setDoOutput(true);  
	            // 获取HttpURLConnection对象对应的输出流  
	            out = new PrintWriter(httpConn.getOutputStream());  
	            // 发送请求参数  
	            out.write(params);  
	            // flush输出流的缓冲  
	            out.flush();  
	            // 定义BufferedReader输入流来读取URL的响应，设置编码方式  
	            in = new BufferedReader(new InputStreamReader(httpConn  
	                    .getInputStream(), "UTF-8"));  
	            String line;  
	            // 读取返回的内容  
	            while ((line = in.readLine()) != null) {  
	            	log.info("企业客户返回信息");
	                result += line;  
	            }  
	        } catch (Exception e) {  
	            log.error("企业客户报错："+Throwables.getStackTraceAsString(e));
	        } finally {  
	            try {  
	                if (out != null) {  
	                    out.close();  
	                }  
	                if (in != null) {  
	                    in.close();  
	                }  
	            } catch (IOException ex) {  
	                ex.printStackTrace();  
	            }  
	        }  
	     //  System.out.println("url::"+result);
	        return result;  
	    }  
}
